package com.jdbc.transactionnew;

import com.jdbc.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * JDBC Part5 数据库事务new
 * Description: DAO 层使用 JDBCUtils 封装的获取、回收连接方法
 * TODO：
 *  1. 无需业务层传递connection参数，直接调用工具类获取connection，可以保证同一线程获取的是相同的连接。
 */
public class BankDao {

    /**
     * 加钱方法
     * @param account 传入账号
     * @param money 传入金额
     * TODO：无需业务传递，connection和加钱是同一个! 才可以在一个事务中!
     * @return 影响行数
     */
    public int addMoney(String account, int money) throws ClassNotFoundException, SQLException {

        // TODO: 无需Service层传递连接参数，直接通过工具类获取，能够保证同一线程获取的是相同的连接
        Connection connection = JdbcUtils.getConnection();

        String sql = "update t_bank set money = money + ? where account = ? ;";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //占位符赋值
        preparedStatement.setObject(1, money);
        preparedStatement.setString(2, account);

        //发送SQL语句
        int rows = preparedStatement.executeUpdate();

        //输出结果
        System.out.println("加钱执行完毕!");

        //关闭资源close
        preparedStatement.close();

        return rows;
    }

    /**
     * 减钱方法
     * @param account
     * @param money
     * TODO：无需业务传递，connection和减钱是同一个! 才可以在一个事务中!
     * @return 影响行数
     */
    public int subMoney(String account, int money) throws ClassNotFoundException, SQLException {

        // TODO:无需Service传递连接，直接通过工具类获取，保证同一线程的方法获取的是相同的连接
        Connection connection = JdbcUtils.getConnection();

        String sql = "update t_bank set money = money - ? where account = ? ;";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //占位符赋值
        preparedStatement.setObject(1, money);
        preparedStatement.setString(2, account);

        //发送SQL语句
        int rows = preparedStatement.executeUpdate();

        //输出结果
        System.out.println("减钱执行完毕!");

        //关闭资源close
        preparedStatement.close();

        return rows;
    }
}
